<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        li{
            list-style: none;
            line-height: 40px;
            border:1px dashed #333;
        }
        .wrap {
            margin-bottom: 40px;
        }
    </style>
</head>

<body>
    <div id="app">
        <p>
            count: {{count}}
        </p>
        <p>
            <button @click="count++">count++</button>
        </p>
        <hr>
        <p>
            <button @click="addEle">addEle</button>
            <button @click="delEle">delEle</button>
        </p>
        <p>
            list:{{list}}
        </p>

        <!-- methods函数演示 -->
        <!-- <p>
            list中的偶数: {{list.filter(v=>v%2 == 0)}}
        </p>
        <p>
            list中的偶数: {{getOu()}}
        </p> -->

        <!-- 计算属性演示 -->
        <p> list中的偶数: {{getEven}}</p>

        <hr>

        <div class="wrap">
            <p>
                <input type="text" v-model="message">
            </p>
            <p>
                message:{{message}}
            </p>
            <p>
                reverseMessage:{{reverseMessage}}
            </p>
        </div>
      
    </div>
</body>
<script>

    /* 
        methods中的方法: 
            1. 初始化渲染阶段, 将挂载元素的html结构作为模板, 将其解析为虚拟DOM,此时如果在模板中调用了Vue实例中的方法,方法会执行一次,将结果存储到虚拟DOM中, 并渲染为真实DOM
            
            2. 如果data中挂载的数据发生改变, 会将模板重新解析为虚拟DOM, 此时如果在模板中调用了Vue实例中的方法,方法也会重新执行一次, 将结果存储到虚拟DOM中, 通过diff算法对比之后渲染为真实DOM

            缺点: methods中的方法,一旦在模板语法中使用,只要数据改变,  模板重新解析为虚拟DOM会再次被调用, 无论数据和方法有误关系

        计算属性:
            概念: 计算属性也叫派生值/衍生值
            计算属性依赖于data中一个或多个的数据,得到的一个新数据, 新数据在初始化渲染阶段被计算并缓存, 只有当依赖的数据改变时,才会重新计算并缓存新的结果,如果依赖的数据没有改变, 会一直使用缓存的结果

            


        如何使用计算属性?
            在new Vue(options) 的配置对象中 新值computed属性,属性值也是一个对象, 此时对象的键名即为计算属性名, 键值要求是一个函数(vue实例内容调用), 将函数的结果赋值给计算属性


            注意:
                1. 计算属性是基于它们的响应式依赖(data中挂载的数据)进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。
                2. 计算属性不仅可以依赖于挂载的数据(data),也可以依赖于其他计算属性
                3. 计算属性只支持同步,不支持异步


            就计算属性而言, 更注重于 其他数据改变,对自身造成的影响 (人人为我)

            老板的收益(计算属性) = 员工A(依赖1) +  员工B(依赖2) +  员工C(依赖3)

       
    
    */
    var vm = new Vue({
        el: "#app",
        data: {
            count:100,
            list: [1, 4, 7, 2, 5, 8, 3, 6, 9, 10],
            message:"",
        },
        methods: {
            addEle() {
                var ele = Math.round(Math.random() * 100); // 随机元素
                this.list.push(ele);
            },
            delEle() {
                var index = Math.floor(Math.random() * this.list.length);
                this.list.splice(index, 1);
            },
            getOu:function(){
                console.log("getOu被调用了");
                return this.list.filter(v => v % 2 == 0);
            }
            
        },
        // 计算属性
        computed:{ // 计算属性可以配置对个
            // computed对象中的键名即为计算属性名, 键值要求是一个函数, 1.该函数在初始化渲染阶段默认被调用一次,  函数的返回值就是计算属性的初始值(此时数据已经被缓存)   2. 当计算属性依赖的数据发生改变, 重新调用函数, 函数返回一个新值(缓存新的结果)

            getEven:function(){
                console.log("getEven被调用了");
                return this.list.filter(v => v % 2 == 0);
                // return [2,4,6,8];
            },

            reverseMessage:function(){
                console.log("reverseMessage执行了");
                return this.message.split("").reverse().join("");
            }
        }


    })


    console.log(vm);

</script>

</html>